package sv.gob.mh.dgii.jasper;

import ar.com.fdvs.dj.domain.builders.FastReportBuilder;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static sv.gob.mh.dgii.jasper.Reporte.getMimeType;
import static sv.gob.mh.dgii.jasper.Reporte.getRandomName;

public class ReportData implements Serializable {

    protected String modulo;
    protected String nombre;
    protected String nombreLogico;
    protected String nombreArchivo;
    protected String rutaImagenes;
    protected String rutaReportes;
    protected String rutaSubreporte;
    protected String tipoMime = "pdf";
    protected String extension = ".jasper";
    protected boolean descargando = false;
    protected boolean cerrarConexionJDBC = false;
    protected Map parametros = new HashMap();
    protected boolean usingConnection = true;
    private int numeroMaximoRegistros;
    // dynamic
    protected FastReportBuilder fastReportBuilder;
    protected List listadoDynamic;

    @Override
    public String toString() {
        return "Reporte{" + "modulo=" + modulo + ", nombre=" + nombre + ", nombreArchivo=" + nombreArchivo + ", rutaImagenes=" + rutaImagenes + ", rutaReportes=" + rutaReportes + ", rutaSubreporte=" + rutaSubreporte + ", tipoMime=" + tipoMime + ", extension=" + extension + ", descargando=" + descargando + ", parametros=" + parametros + '}';
    }

    public void initPath() {
        nombreArchivo = "/" + modulo + "/" + nombre + extension;
    }

    private void validateTipoMime() {
        if (tipoMime == null || (tipoMime != null && "".equals(tipoMime.trim()))) {
            tipoMime = "pdf";
        }
        tipoMime = tipoMime.replaceAll("\\.", "");
    }

    public String getNombreDeArchivoDescargable() {
        validateTipoMime();
        return modulo + "_" + nombre + "." + tipoMime;
    }

    public String getContetTypeArchivoDescargable() {
        validateTipoMime();
        return getMimeType(tipoMime);
    }

    public void validateName() {
        if (nombre == null || (nombre != null && "".equals(nombre.trim()))) {
            nombre = getRandomName("reporte");
        }
    }

    public void validateParams() {
        if (parametros == null) {
            parametros = new HashMap<String, Object>();
        }
    }

    public void addParameter(String key, Object parameter) {
        validateParams();
        getParametros().put(key, parameter);
    }

    public void addParameters(Map<String, Object> parameters) {
        validateParams();
        getParametros().putAll(parameters);
    }

    public Object getParameter(String key) {
        return getParametros().get(key);
    }

    /**
     * @return the modulo
     */
    public String getModulo() {
        return modulo;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param modulo the modulo to set
     */
    public void setModulo(String modulo) {
        this.modulo = modulo;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
        addParameter("JASPER_REPORT_TITLE", nombre);
    }

    /**
     * @return the rutaImagenes
     */
    public String getRutaImagenes() {
        return rutaImagenes;
    }

    /**
     * @param rutaImagenes the rutaImagenes to set
     */
    public void setRutaImagenes(String rutaImagenes) {
        this.rutaImagenes = rutaImagenes;
        addParameter("IMAGE_PATH", rutaImagenes);
    }

    /**
     * @return the nombreArchivo
     */
    public String getNombreArchivo() {
        return nombreArchivo;
    }

    /**
     * @param nombreArchivo the nombreArchivo to set
     */
    public void setNombreArchivo(String nombreArchivo) {
        this.nombreArchivo = nombreArchivo;
    }

    /**
     * @return the rutaReportes
     */
    public String getRutaReportes() {
        return rutaReportes;
    }

    /**
     * @param rutaReportes the rutaReportes to set
     */
    public void setRutaReportes(String rutaReportes) {
        this.rutaReportes = rutaReportes;
        addParameter("JASPER_REPORT_PATH", rutaReportes);
    }

    /**
     * @return the rutaSubreporte
     */
    public String getRutaSubreporte() {
        return rutaSubreporte;
    }

    /**
     * @param rutaSubreporte the rutaSubreporte to set
     */
    public void setRutaSubreporte(String rutaSubreporte) {
        this.rutaSubreporte = rutaSubreporte;
        addParameter("SUBREPORT_DIR", rutaSubreporte);
    }

    /**
     * @return the extension
     */
    public String getExtension() {
        return extension;
    }

    /**
     * @param extension the extension to set
     */
    public void setExtension(String extension) {
        this.extension = extension;
    }

    /**
     * @return the tipoMime
     */
    public String getTipoMime() {
        return tipoMime;
    }

    /**
     * @param tipoMime the tipoMime to set
     */
    public void setTipoMime(String tipoMime) {
        this.tipoMime = tipoMime;
        validateTipoMime();
    }

    /**
     * @return the descargando
     */
    public boolean isDescargando() {
        return descargando;
    }

    /**
     * @param descargando the descargando to set
     */
    public void setDescargando(boolean descargando) {
        this.descargando = descargando;
    }

    /**
     * @return the parametros
     */
    public Map<String, Object> getParametros() {
        return parametros;
    }

    /**
     * @param parametros the parametros to set
     */
    public void setParametros(Map<String, Object> parametros) {
        this.parametros = parametros;
    }

    /**
     * @return the cerrarConexionJDBC
     */
    public boolean isCerrarConexionJDBC() {
        return cerrarConexionJDBC;
    }

    /**
     * @param cerrarConexionJDBC the cerrarConexionJDBC to set
     */
    public void setCerrarConexionJDBC(boolean cerrarConexionJDBC) {
        this.cerrarConexionJDBC = cerrarConexionJDBC;
    }

    /**
     * @return the nombreLogico
     */
    public String getNombreLogico() {
        return nombreLogico;
    }

    /**
     * @param nombreLogico the nombreLogico to set
     */
    public void setNombreLogico(String nombreLogico) {
        this.nombreLogico = nombreLogico;
    }

    /**
     * @return the usingConnection
     */
    public boolean isUsingConneciton() {
        return usingConnection;
    }

    /**
     * @param usingConnection the usingConnection to set
     */
    public void setUsingConnection(boolean usingConnection) {
        this.usingConnection = usingConnection;
    }

    /**
     * @return the fastReportBuilder
     */
    public FastReportBuilder getFastReportBuilder() {
        return fastReportBuilder;
    }

    /**
     * @param fastReportBuilder the fastReportBuilder to set
     */
    public void setFastReportBuilder(FastReportBuilder fastReportBuilder) {
        this.fastReportBuilder = fastReportBuilder;
    }

    /**
     * @return the listadoDynamic
     */
    public List getListadoDynamic() {
        return listadoDynamic;
    }

    /**
     * @param listadoDynamic the listadoDynamic to set
     */
    public void setListadoDynamic(List listadoDynamic) {
        this.listadoDynamic = listadoDynamic;
    }

    /**
     * @return the numeroMaximoRegistros
     */
    public int getNumeroMaximoRegistros() {
        return numeroMaximoRegistros;
    }

    /**
     * @param numeroMaximoRegistros the numeroMaximoRegistros to set
     */
    public void setNumeroMaximoRegistros(int numeroMaximoRegistros) {
        numeroMaximoRegistros = numeroMaximoRegistros > 0 ? numeroMaximoRegistros : Reporte.MAX_NUM_ROWS_PER_REPORT;
        this.numeroMaximoRegistros = numeroMaximoRegistros;
        addParameter("REPORT_MAX_COUNT", numeroMaximoRegistros);

    }
}
